/* DigiDoc4J library
*
* This software is released under either the GNU Library General Public
* License (see LICENSE.LGPL).
*
* Note that the only valid version of the LGPL license as far as this
* project is concerned is the original GNU Library General Public License
* Version 2.1, February 1999
*/
/*
* Thanks to Aleksandr Zhuikov (http://aleksz-programming.blogspot.com.ee/2014/02/restricting-system-resource-access-in.html)
*/
package org.digidoc4j.testutils;
import java.security.Permission;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import org.apache.commons.lang.StringUtils;
import org.junit.rules.ExternalResource;
/**
* JUnit rule for making sure that the code under test would not write anything to the file system.
*/
public class RestrictedFileWritingRule extends ExternalResource {
private Collection<String> whiteList;
public RestrictedFileWritingRule(String... whiteList) {
this.whiteList = Arrays.asList(whiteList);
}
@Override
protected void before() throws Throwable {
super.before();
System.setSecurityManager(new SecurityManager() {
@Override
public void checkWrite(String file) {
if(!isAllowedToWrite(file)) {
throw new FileWritingRestrictedException();
}
}
@Override
public void checkPermission(Permission perm) {
return;
}
});
}
@Override
protected void after() {
System.setSecurityManager(null); // or save and restore original
super.after();
}
private boolean isAllowedToWrite(String file) {
for(String prefix: whiteList) {
if(StringUtils.startsWith(file, prefix)) {
return true;
}
}
return false;
}
/**
* File writing operations happened when not allowed.
*/
public static class FileWritingRestrictedException extends RuntimeException {
}
}